package mybatis.test;

import mybatis.dao.EmployeeMapper;
import mybatis.yang.Employee;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.InputStream;

public class Mybatistest {

    public SqlSessionFactory getSqlSesionFactory() throws Exception{
        String resource = "Conf/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(inputStream);
    }




    /*
    * 1.根据xml配置文件(全局配置文件),创建一个SqlSessionFactory对象
    *       有数据源一些运行环境信息
    * 2.sql映射文件: 配置每一个sql,以及sql的封装规则
    * 3.将sql映射文件注册到全局配置文件中
    * 4.写代码
    *       1).根据全局配置文件得到SqlSessionFactory
    *       2).使用sqlSession工厂,获取到sqlSession对象使用它来执行增删改查
    *           一个sqlSession就是代表和数据库的一次会话,用完关闭
    *       3).使用sql的唯一标识来告诉MyBatis执行哪个sql.sql都是保存在sql映射文件中的
    *
    *
    * */
    @Test
    public void test() throws Exception{
    String resource = "Conf/mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    //获取sqlSession实例,能直接执行已经映射的sql语句
        SqlSession opensession =sqlSessionFactory.openSession();
         try{
             //第一个参数传生气了语句的唯一标识
             //第二个参数就是传入的参数,说明你要显示sql语句查数来的第几行数据.
             Employee employee = opensession.selectOne("mybatis.yang.EmployeeMapper.selectBlog", 1);
             System.out.println(employee);
         }
        finally{
            opensession.close();
        }
    }




    /*
    * 1.接口式编程
    *   原生:  Dao ===>  DaoImpl
    *   mybatis:  Mapper ===>  xxMapper.xml
    * 2.SqlSession代表和数据库的一次会话,用完必须关闭
    * 3.SqlSession和connection一样都是非线程安全的,每次用完都应该去获取新的对象,即不能设置为变量.
    * 4.Mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象.
    *           (将接口和xml进行绑定)
    *           EmployeeMapper empMapper=sqlSession.getMapper(EmployeeMapper.class)
    *5.两个重要的配置文件
    *       mybatis的全局配置文件,包含数据库连接池信息,事物管理器信息等...系统运行环境信息.
    *       sql映射文件:保存了每一个sql语句的映射信息.将sql抽取出来.
    *
    * */
    @Test
    public void test2() throws Exception {
        //1.获取SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory=getSqlSesionFactory();
        //2.获取SqlSession对象
        SqlSession openSession=sqlSessionFactory.openSession();
        try {
            //3.获取接口实现类对象
            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
            //会为接口的方法自动创建一个代理对象(mybatis创建的),代理对象去执行增删改查方法
            Employee employee = mapper.getEmpById(1);
            System.out.println(employee);


            //手动提交数据
            openSession.commit();
        }finally {
            openSession.close();
        }
    }


    /*测试增删改查
    * 1.myabtis允许增删改直接定义以下类型返回值
    *   Integer,long,Boolean
    * 2.我们需要手动提交数据
    *   sqlSessionFactory.openSession();===>手动提交
    *   openSession.commit();
    *   sqlSessionFactory.openSession(true);===>自动提交
    * */
    @Test
    public void teat03() throws Exception{
        SqlSessionFactory sqlSessionFactory=getSqlSesionFactory();
        SqlSession openSession=sqlSessionFactory.openSession();
        try{
            EmployeeMapper mapper=openSession.getMapper(EmployeeMapper.class);
            //查看第几行的数据
//            Employee employee=mapper.getEmpById(1);
//            System.out.println(employee);
//            int d=mapper.getEmpByusernameandBypassword("4","trn2");
//             System.out.println(d);

            //增加数据
//            Employee employee=new Employee(null,"trn","0","1106649987@qq.com");
//            boolean bol=mapper.addEmp(employee);
//            System.out.println(bol);
//            System.out.println(employee.getId());
            //修改数据
//            Employee employee=new Employee("3","trn","0","1106649987@qq.com");
//            mapper.update(employee);
            //删除数据
//            boolean bol=mapper.deleteEmpById(3);
//            System.out.println(bol);
            openSession.commit();
        }finally {
            openSession.close();
        }
    }


}
